home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / term-source.lha / InfoWindow.c < prev    next >
C/C++ Source or Header  |  1996-10-20  |  8KB  |  393 lines

  1. /*
  2. **    InfoWindow.c
  3. **
  4. **    Status information window support routines
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. **
  9. **    :ts=4
  10. */
  11.  
  12. #ifndef _GLOBAL_H
  13. #include "Global.h"
  14. #endif
  15.  
  16. enum    {    GAD_UPDATE=1,GAD_SESSION,GAD_BYTES_IN_OUT,GAD_CONNECT_STRING,GAD_BBS_INFO,
  17.             GAD_SCREEN_SIZE,GAD_PORT_NAME,GAD_BUFFER_SIZE,GAD_MEMORY,
  18.         };
  19.  
  20. STATIC struct Process    *InfoProcess;
  21. STATIC LayoutHandle        *InfoHandle;
  22.  
  23.     /* LocalRefreshInfoWindow():
  24.      *
  25.      *    Refresh, i.e. redraw, the contents of the info window.
  26.      */
  27.  
  28. STATIC VOID
  29. LocalRefreshInfoWindow(VOID)
  30. {
  31.     if(InfoWindow)
  32.     {
  33.         UBYTE DummyBuffer[256];
  34.  
  35.         LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,ConvNumber,BytesIn);
  36.  
  37.         LT_SetAttributes(InfoHandle,GAD_BYTES_IN_OUT,
  38.             LABX_Index,    0,
  39.             LABX_Text,    DummyBuffer,
  40.         TAG_DONE);
  41.  
  42.         LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,ConvNumber,BytesOut);
  43.  
  44.         LT_SetAttributes(InfoHandle,GAD_BYTES_IN_OUT,
  45.             LABX_Index,    1,
  46.             LABX_Text,    DummyBuffer,
  47.         TAG_DONE);
  48.  
  49.         Forbid();
  50.  
  51.         if(XEmulatorBase && XEM_IO)
  52.         {
  53.             if(XEmulatorBase->lib_Version >= 4)
  54.             {
  55.                 ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  56.  
  57.                 LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,"%ld × %ld",XEMI_EXTRACT_COLUMNS(Result),XEMI_EXTRACT_LINES(Result));
  58.             }
  59.             else
  60.                 strcpy(DummyBuffer,"???");
  61.         }
  62.         else
  63.             LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,"%ld × %ld",LastColumn + 1,LastLine + 1);
  64.  
  65.         Permit();
  66.  
  67.         LT_SetAttributes(InfoHandle,GAD_SCREEN_SIZE,
  68.             GTTX_Text,    DummyBuffer,
  69.         TAG_DONE);
  70.  
  71.         LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,ConvNumber,BufferSpace);
  72.  
  73.         LT_SetAttributes(InfoHandle,GAD_BUFFER_SIZE,
  74.             GTTX_Text,    DummyBuffer,
  75.         TAG_DONE);
  76.  
  77.         LimitedSPrintf(sizeof(DummyBuffer),DummyBuffer,ConvNumber,AvailMem(MEMF_ANY));
  78.  
  79.         LT_SetAttributes(InfoHandle,GAD_MEMORY,
  80.             GTTX_Text,    DummyBuffer,
  81.         TAG_DONE);
  82.  
  83.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  84.             LABX_Index,    0,
  85.             LABX_Text,    CurrentBBSName[0] ? CurrentBBSName : (STRPTR)"-",
  86.         TAG_DONE);
  87.  
  88.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  89.             LABX_Index,    1,
  90.             LABX_Text,    CurrentBBSNumber[0] ? CurrentBBSNumber : (STRPTR)"-",
  91.         TAG_DONE);
  92.  
  93.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  94.             LABX_Index,    2,
  95.             LABX_Text,    CurrentBBSComment[0] ? CurrentBBSComment : (STRPTR)"-",
  96.         TAG_DONE);
  97.  
  98.         LT_SetAttributes(InfoHandle,GAD_BBS_INFO,
  99.             LABX_Index,    3,
  100.             LABX_Text,    UserName[0] ? UserName : (STRPTR)"-",
  101.         TAG_DONE);
  102.     }
  103. }
  104.  
  105.     /* LocalCloseInfoWindow():
  106.      *
  107.      *    Close the info window.
  108.      */
  109.  
  110. STATIC VOID
  111. LocalCloseInfoWindow(VOID)
  112. {
  113.     CheckItem(MEN_STATUS_WINDOW,FALSE);
  114.  
  115.     if(InfoWindow)
  116.         PutWindowInfo(WINDOW_STATUS,InfoWindow->LeftEdge,InfoWindow->TopEdge,InfoWindow->Width,InfoWindow->Height);
  117.  
  118.     if(InfoHandle)
  119.     {
  120.         LT_DeleteHandle(InfoHandle);
  121.  
  122.         InfoHandle = NULL;
  123.     }
  124.  
  125.     InfoWindow = NULL;
  126. }
  127.  
  128.     /* LocalOpenInfoWindow():
  129.      *
  130.      *    Open the info window.
  131.      */
  132.  
  133. STATIC BOOL
  134. LocalOpenInfoWindow(VOID)
  135. {
  136.     if(InfoHandle = LT_CreateHandleTags(Window->WScreen,
  137.         LAHN_LocaleHook,    &LocaleHook,
  138.     TAG_DONE))
  139.     {
  140.         LONG Left,Top,Width,Height;
  141.  
  142.         GetWindowInfo(WINDOW_STATUS,&Left,&Top,&Width,&Height,0,0);
  143.  
  144.         LT_New(InfoHandle,
  145.             LA_Type,    VERTICAL_KIND,
  146.         TAG_DONE);
  147.         {
  148.             LT_New(InfoHandle,
  149.                 LA_Type,    VERTICAL_KIND,
  150.             TAG_DONE);
  151.             {
  152.                 UBYTE DummyBuffer[256];
  153.  
  154.                 if(!FormatStamp(&SessionStart,DummyBuffer,sizeof(DummyBuffer),FALSE))
  155.                     strcpy(DummyBuffer,"-");
  156.  
  157.                 LT_New(InfoHandle,
  158.                     LA_Type,            TEXT_KIND,
  159.                     LA_LabelID,            MSG_INFOWINDOW_SESSION_START_GAD,
  160.                     LA_ID,                GAD_SESSION,
  161.                     LA_Chars,            40,
  162.                     GTTX_Text,            DummyBuffer,
  163.                     GTTX_Border,        TRUE,
  164.                     GTTX_CopyText,        TRUE,
  165.                 TAG_DONE);
  166.  
  167.                 LT_New(InfoHandle,
  168.                     LA_Type,            XBAR_KIND,
  169.                 TAG_DONE);
  170.  
  171.                 LT_New(InfoHandle,
  172.                     LA_Type,            BOX_KIND,
  173.                     LA_ID,                GAD_BYTES_IN_OUT,
  174.                     LABX_FirstLabel,    MSG_INFOWINDOW_BYTES_RECEIVED_GAD,
  175.                     LABX_LastLabel,        MSG_INFOWINDOW_BYTES_SENT_GAD,
  176.                     LABX_ReserveSpace,    TRUE,
  177.                     LABX_DrawBox,        TRUE,
  178.                     LA_Chars,            40,
  179.                 TAG_DONE);
  180.  
  181.                 LT_New(InfoHandle,
  182.                     LA_Type,            XBAR_KIND,
  183.                 TAG_DONE);
  184.  
  185.                 LT_New(InfoHandle,
  186.                     LA_Type,            TEXT_KIND,
  187.                     LA_LabelID,            MSG_INFOWINDOW_CONNECTION_MESSAGE_GAD,
  188.                     LA_ID,                GAD_CONNECT_STRING,
  189.                     GTTX_Text,            BaudBuffer[0] ? BaudBuffer : (STRPTR)"-",
  190.                     GTTX_Border,        TRUE,
  191.                     GTTX_CopyText,        TRUE,
  192.                 TAG_DONE);
  193.  
  194.                 LT_New(InfoHandle,
  195.                     LA_Type,            BOX_KIND,
  196.                     LA_ID,                GAD_BBS_INFO,
  197.                     LABX_FirstLabel,    MSG_INFOWINDOW_BBS_NAME_GAD,
  198.                     LABX_LastLabel,        MSG_INFOWINDOW_BBS_USER_NAME_GAD,
  199.                     LABX_ReserveSpace,    TRUE,
  200.                     LABX_DrawBox,        TRUE,
  201.                     LA_Chars,            40,
  202.                 TAG_DONE);
  203.  
  204.                 LT_New(InfoHandle,
  205.                     LA_Type,            XBAR_KIND,
  206.                 TAG_DONE);
  207.  
  208.                 LT_New(InfoHandle,
  209.                     LA_Type,            TEXT_KIND,
  210.                     LA_LabelID,            MSG_INFOWINDOW_SCREEN_SIZE_GAD,
  211.                     LA_ID,                GAD_SCREEN_SIZE,
  212.                     GTTX_Border,        TRUE,
  213.                     GTTX_CopyText,        TRUE,
  214.                 TAG_DONE);
  215.  
  216.                 LT_New(InfoHandle,
  217.                     LA_Type,            TEXT_KIND,
  218.                     LA_LabelID,            MSG_INFOWINDOW_AREXX_PORT_NAME_GAD,
  219.                     LA_ID,                GAD_PORT_NAME,
  220.                     GTTX_Text,            RexxPortName,
  221.                     GTTX_Border,        TRUE,
  222.                     GTTX_CopyText,        TRUE,
  223.                 TAG_DONE);
  224.  
  225.                 LT_New(InfoHandle,
  226.                     LA_Type,            TEXT_KIND,
  227.                     LA_LabelID,            MSG_INFOWINDOW_BUFFER_SIZE_GAD,
  228.                     LA_ID,                GAD_BUFFER_SIZE,
  229.                     GTTX_Border,        TRUE,
  230.                     GTTX_CopyText,        TRUE,
  231.                 TAG_DONE);
  232.  
  233.                 LT_New(InfoHandle,
  234.                     LA_Type,            TEXT_KIND,
  235.                     LA_LabelID,            MSG_INFOWINDOW_FREE_MEMORY_GAD,
  236.                     LA_ID,                GAD_MEMORY,
  237.                     GTTX_Border,        TRUE,
  238.                     GTTX_CopyText,        TRUE,
  239.                 TAG_DONE);
  240.  
  241.                 LT_EndGroup(InfoHandle);
  242.             }
  243.  
  244.             LT_New(InfoHandle,
  245.                 LA_Type,VERTICAL_KIND,
  246.             TAG_DONE);
  247.             {
  248.                 LT_New(InfoHandle,
  249.                     LA_Type,    XBAR_KIND,
  250.                     LAXB_FullSize,    TRUE,
  251.                 TAG_DONE);
  252.  
  253.                 LT_EndGroup(InfoHandle);
  254.             }
  255.  
  256.             LT_New(InfoHandle,
  257.                 LA_Type,    HORIZONTAL_KIND,
  258.             TAG_DONE);
  259.             {
  260.                 LT_New(InfoHandle,
  261.                     LA_Type,        BUTTON_KIND,
  262.                     LA_LabelID,        MSG_V36_1414,
  263.                     LA_ID,            GAD_UPDATE,
  264.                     LABT_ReturnKey,    TRUE,
  265.                     LABT_ExtraFat,    TRUE,
  266.                 TAG_DONE);
  267.  
  268.                 LT_EndGroup(InfoHandle);
  269.             }
  270.  
  271.             LT_EndGroup(InfoHandle);
  272.         }
  273.  
  274.         if(InfoWindow = LT_Build(InfoHandle,
  275.             LAWN_TitleID,        MSG_INFOWINDOW_STATUS_INFORMATION_TXT,
  276.             LAWN_IDCMP,            IDCMP_CLOSEWINDOW,
  277.             LAWN_HelpHook,        &GuideHook,
  278.             LAWN_Left,            Left,
  279.             LAWN_Top,            Top,
  280.             WA_DepthGadget,        TRUE,
  281.             WA_CloseGadget,        TRUE,
  282.             WA_DragBar,            TRUE,
  283.             WA_RMBTrap,            TRUE,
  284.             WA_SimpleRefresh,    TRUE,
  285.         TAG_DONE))
  286.         {
  287.             LocalRefreshInfoWindow();
  288.  
  289.             return(TRUE);
  290.         }
  291.         else
  292.         {
  293.             LT_DeleteHandle(InfoHandle);
  294.  
  295.             InfoHandle = NULL;
  296.         }
  297.     }
  298.  
  299.     return(FALSE);
  300. }
  301.  
  302. STATIC VOID SAVE_DS
  303. StatusProcessEntry(VOID)
  304. {
  305.     struct Process *Parent = ThisProcess;
  306.  
  307.     if(LocalOpenInfoWindow())
  308.     {
  309.         struct IntuiMessage    *Message;
  310.         struct Gadget *MsgGadget;
  311.         ULONG MsgClass;
  312.         BOOL Done;
  313.  
  314.         InfoProcess = (struct Process *)FindTask(NULL);
  315.  
  316.         Signal((struct Task *)Parent,SIG_HANDSHAKE);
  317.  
  318.         Done = FALSE;
  319.  
  320.         do
  321.         {
  322.             if(Wait(PORTMASK(InfoWindow->UserPort) | SIG_KILL) & SIG_KILL)
  323.                 break;
  324.             else
  325.             {
  326.                 while(Message = LT_GetIMsg(InfoHandle))
  327.                 {
  328.                     MsgClass    = Message->Class;
  329.                     MsgGadget    = (struct Gadget *)Message->IAddress;
  330.  
  331.                     LT_ReplyIMsg(Message);
  332.  
  333.                     switch(MsgClass)
  334.                     {
  335.                         case IDCMP_CLOSEWINDOW:
  336.  
  337.                             if(!Done)
  338.                             {
  339.                                 Forbid();
  340.  
  341.                                 if(!(SetSignal(0,SIG_KILL) & SIG_KILL))
  342.                                     Parent = NULL;
  343.  
  344.                                 Done = TRUE;
  345.                             }
  346.  
  347.                             break;
  348.  
  349.                         case IDCMP_GADGETUP:
  350.  
  351.                             if(MsgGadget->GadgetID == GAD_UPDATE)
  352.                                 LocalRefreshInfoWindow();
  353.  
  354.                             break;
  355.                     }
  356.                 }
  357.             }
  358.         }
  359.         while(!Done);
  360.  
  361.         LocalCloseInfoWindow();
  362.     }
  363.  
  364.     Forbid();
  365.  
  366.     InfoProcess = NULL;
  367.  
  368.     if(Parent)
  369.         Signal((struct Task *)Parent,SIG_HANDSHAKE);
  370. }
  371.  
  372. VOID
  373. CloseInfoWindow()
  374. {
  375.     ShakeHands((struct Task *)InfoProcess,SIG_KILL);
  376. }
  377.  
  378. VOID
  379. OpenInfoWindow()
  380. {
  381.     if(!InfoProcess)
  382.     {
  383.         StartProcessWaitForHandshake("term Status Window Process",(TASKENTRY)StatusProcessEntry,
  384.             NP_WindowPtr,    -1,
  385.         TAG_DONE);
  386.     }
  387.  
  388.     if(InfoProcess)
  389.         CheckItem(MEN_STATUS_WINDOW,TRUE);
  390.     else
  391.         CheckItem(MEN_STATUS_WINDOW,FALSE);
  392. }
  393.